<?php
/**
 * 组件基础类
 *
 * @author Mo yi <root@imoi.cn>
 * @link   http://www.imoi.cn
 * @copyright Copyright &copy; 2010-2012 DuoLam Software LLC
 * @license http://www.imoi.cn/license/
 * @version $Id: dpComponent.php 2799 2012-04-03 16:09:13Z Mo.yi $
 * @package system
 * @since 1.0
 */
class dpComponent
{
	private static $_o;

	protected $component;

	/**
	 * 设置应用程序的配置
	 * @param array or string $config 配置文件数组或某组配置名
	 * @param string $name 组配置名下的子配置名
	 * @code php
	 * 方法1：$this->setConfig('component','db');
	 * 返回配置文件组件里的db数组配置信息
	 * 方法2：$this->setConfig('system');
	 * 返回配置文件的系统配置信息数组
	 * 方法3：$this->setConfig(D::$config);
	 * 则把配置信息每个数组变成类成员属性，如：
	 * $this->access['default_control']
	 * 获取设置的默认控制器
	 * @code end
	 * @return array or mixed
	 */
	public function setConfig($config,$name = null)
	{
		if (!empty($config) && is_array($config)) {
			foreach($config as $key => $c) $this->$key = $c;
		} else if (is_string($config) && !empty($name)) {
			if(isset(D::$config[$config][$name]))
				return D::$config[$config][$name];
			else
				return false;
		} else if (is_string($config)) {
			if (isset(D::$config[$config]))
				return D::$config[$config];
			else
				return false;
		}
		return false;
	}

	public function __set($name,$value)
	{
		$this->$name = $value;
	}

	/**
	 * 魔术方法，调用不存在的成员触发
	 */
	public function __get($name)
	{
		if (!isset($this->$name)) dpException::error('类属性不存在：'.$name);
	}

	/**
     * 魔术方法，调用不存在的方法时触发。
     */
	public function __call($name,$param)
	{
		if (isset(self::$_o[$name])) {
			return self::$_o[$name];
		} else {
			$coreComponent = dpApplication::registerCoreComponent();

			if (isset($this->component[$name]))
				$array = $this->component[$name];
			else if(isset($coreComponent[$name]))
				$array = $coreComponent[$name];
			else dpException::error('类属性不存在或者调用了不存在的组件：'.$name);

			if (!empty($array['class'])) {
				self::$_o[$name] = self::_setMethodParams($array['class'],$param);
				$this->_setAttr(self::$_o[$name], $array);
				return self::$_o[$name];		
			} else dpException::error('组件 '.$name.' 不是核心组件，缺少指定类文件');
		}
	}


	private function _setAttr(&$component, $arrays)
	{
		unset($arrays['class']);
		if (!empty($arrays)) {
			foreach ($arrays as $name => $value) {
				$val = property_exists($component, $name) ? $value : false;
				if ($val !== false) $component->$name = $value;
			}
		}
		unset($component, $array);
	}

	/**
	 * 自动设置类参数
	 * @param string $class  类名
	 * @param array  $params 类参数
	 * @return object
	 */
	protected static function _setMethodParams($class, $params)
	{	
		class_exists($class) or dpException::error('类不存在'.$class);
		$count = count($params);
		if ($count == 1)
			return new $class($params[0]);
		else if ($count == 2)
			return new $class($params[0], $params[1]);
		else
			return new $class();
	}
}
?>
